package jumavidesktop.Persistencia.Dao.Implementaciones;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import jumavidesktop.Otros.Pojos.MyRespuesta;
import jumavidesktop.Otros.Pojos.consNamed;
import jumavidesktop.Persistencia.Dao.AbstractDAO;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoCamaras;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoConfigANPR;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoConfigMotion;
import jumavidesktop.Persistencia.Dao.Interfaces.IDaoMovimientos;
import jumavidesktop.Persistencia.Dao.WrapperTransaction;
import jumavidesktop.Persistencia.entidades.Camara;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author vimso
 */
public class DaoCamaras extends AbstractDAO<Camara> implements IDaoCamaras {

    public DaoCamaras() {
        super();
    }
    public DaoCamaras( EntityManager entityManager) {
        super( entityManager);
    }

    @Override
    public MyRespuesta verificarDatosMinimos(Camara entidad) {
        
        MyRespuesta respuesta= new MyRespuesta();
        //Debe de tener por lo menos las dos entidades de  config (ANPR y MOTION)
        if (entidad.getConfiganpr()==null) {
            respuesta.addError("Se deben introducir los datos de configuración del ANPR");
        }else
        {
            IDaoConfigANPR daoANPR= new DaoConfigANPR(this.entityManager);
            respuesta.agregarMyRespuesta(daoANPR.verificarDatosMinimos(entidad.getConfiganpr()));
        }
        if (entidad.getConfigdetectionmotion()==null) {
            respuesta.addError("Se deben introducir los datos de configuración del motion");
        }
        else
        {
            IDaoConfigMotion daoMotion= new DaoConfigMotion(this.entityManager);
            respuesta.agregarMyRespuesta(daoMotion.verificarDatosMinimos(entidad.getConfigdetectionmotion()));
        }
        if (StringUtils.isBlank(entidad.getNombre())) {
            respuesta.addError("Se deben introducir el nombre de la camara");
        }
        
        return respuesta;
    }
    
    @Override
    public MyRespuesta verificarEntidadAlGuardar(Camara entidad) {
        
        MyRespuesta respuesta=this.verificarDatosMinimos(entidad);
        
        if (respuesta.getTodoOK() ) {
            //Verifico las entidades hijas    
            IDaoConfigANPR daoANPR=  new DaoConfigANPR(this.entityManager);
            IDaoConfigMotion daoMotion=  new DaoConfigMotion(this.entityManager);
            
            respuesta.agregarMyRespuesta(daoANPR.verificarEntidadAlGuardar(entidad.getConfiganpr()));
            respuesta.agregarMyRespuesta(daoMotion.verificarEntidadAlGuardar(entidad.getConfigdetectionmotion()));
            
        }
        return respuesta;
    }

    @Override
    public MyRespuesta verificarEntidadAlModificar(Camara entidad) {
        return this.verificarDatosMinimos(entidad);
    }

    @Override
    public MyRespuesta verificarEntidadAlEliminar(Camara entidad) {
        //Siempre que no tenga movimientos
        MyRespuesta respuesta= new MyRespuesta();
        IDaoMovimientos daoMovimientos = new DaoMovimientos();
        if (daoMovimientos.getMovimientosByCamaras(entidad).size()>0) {
            respuesta.addError("La cámara que quiere borrar tiene movimientos, elimine primero los movimientos");
        }
        return respuesta;
    }

    @Override
    public List<Camara> obtenerCamarasActivas() {
        
        consNamed consulta = new consNamed();
        consulta.setNamedQuery(Camara.BuscarTodos);
        List<Camara> valor = this.consultaNMBBDD(consulta);
        return valor;
    }

    @Override
    public MyRespuesta guardarCamara(Camara camara) {
        WrapperTransaction wTr = new WrapperTransaction( this.entityManager.getTransaction());
        MyRespuesta respuesta= new MyRespuesta();
        try {
            wTr.begin();    
                respuesta=this.agregarElemento(camara);
                if (respuesta.getTodoOK()) {
                   wTr.commit();    
            } else {
                    wTr.rollback();
            }
            
        } catch (Exception e) {
            respuesta.addError(e.getMessage());
            wTr.rollback();
        }
        
        return respuesta;
    }

    @Override
    public MyRespuesta eliminarCamara(Camara camara) {
        return this.eliminarElemento(camara);
    }

    @Override
    public MyRespuesta modificarCamara(Camara camara) {
        return this.actualizarElemento(camara);
    }

    @Override
    protected Class getClase() {
        return Camara.class;
    }

    @Override
    public boolean tieneRegistros() {
        return this.existenRegistros();
    }

    @Override
    public Camara encuentraEntidad(Object id) {
        return this.encuentraRegistro(Camara.class, id);
    }

    @Override
    public MyRespuesta actualizarCamara(Camara camara) {
        WrapperTransaction wTr = new WrapperTransaction(this.entityManager.getTransaction());
        MyRespuesta respuesta = new MyRespuesta();
        
        //Primero verifico si modifica a un camara que no existe
        if (null==this.encuentraEntidad(camara.getId())) {
            respuesta.addError("La cámara que esta modificacndo ya no existe");
            return respuesta;
        }
        
        //Verifico las Configuraciones
        IDaoConfigANPR daoConfigANPR= new DaoConfigANPR(this.entityManager);
        IDaoConfigMotion daoConfigMotion= new DaoConfigMotion(this.entityManager);
        
        respuesta.agregarMyRespuesta(daoConfigANPR.verificarEntidadAlModificar(camara.getConfiganpr()));
        respuesta.agregarMyRespuesta(daoConfigMotion.verificarEntidadAlModificar(camara.getConfigdetectionmotion()));    
        
        if (respuesta.getTodoOK()) {
            try {
                wTr.begin();
                respuesta.agregarMyRespuesta(this.actualizarElemento(camara));
                wTr.terminaTransaccion(respuesta);                
            } catch (Exception e) {
                wTr.rollback();
                respuesta.addError(e.getMessage());
            }
        }
        return respuesta;
    }

    @Override
    public Camara encuentraPorNombre(String nombre) {
        
        consNamed parametors= new consNamed();
        parametors.setNamedQuery(Camara.BuscarPorNombre);
        Map<String, Object> parametro = new HashMap<String, Object>();
        parametro.put(Camara.PaBuscarTodos_Nombre,nombre);
        parametors.setParametros(parametro);
        
        return this.consultaNMBBDD(parametors).get(0); //Como es una clave primaria sólo puede encontrar null o la entidad en si
    }

    @Override
    public void ponerCamaraDesactiva() {
        List<Camara> camras=this.entityManager.createQuery("Select a from Camara a",Camara.class).getResultList();
        for (Camara camara : camras) {
            camara.setActivo(false);
            this.actualizarCamara(camara);
        }
        
        
        
        
    }

}
